<?php

namespace app\common\command\task;

use app\common\command\Task;
use app\common\enum\RedisKeyEnum;
use app\common\model\AnswerQuestion;
use app\common\model\CoursePaper;
use app\common\model\CoursePaperLearnStats;
use app\common\model\CoursePaperCateLearnStats;
use app\common\model\CourseLearnStats;
use app\common\exception\BusinessException;
use think\facade\Cache;

/**
 * 处理用户答题消息队列
 */
class ProcessUserAnswerQueue extends Task
{
    /**
     * 每次处理的消息数量
     * @var int
     */
    protected $batchSize = 100;

    /**
     * 执行任务
     * @return void
     */
    public function invoke()
    {
        // 测试方法调用（固定参数）
        // $this->test(10573, 35170);

        // die();

        // 从Redis队列中批量获取消息
        $redis = Cache::store('redis')->handler();
        $messages = $redis->lRange(RedisKeyEnum::USER_ANSWER_QUEUE, 0, $this->batchSize - 1);

        // 如果没有消息，直接返回
        if (empty($messages)) {
            return;
        }

        // 从队列中移除已获取的消息
        $redis->lTrim(RedisKeyEnum::USER_ANSWER_QUEUE, count($messages), -1);

        // 处理每一条消息
        foreach ($messages as $message) {
            // 解析消息
            $data = json_decode($message, true);
            if (!$data) {
                continue;
            }

            // 提取uid和extend_id(试卷编号)
            $uid = $data['uid'] ?? 0;
            $extendId = $data['extend_id'] ?? 0;

            if (!$uid || !$extendId) {
                continue;
            }

            // 处理消息
            $this->processMessage($uid, $extendId);
        }
    }

    /**
     * 测试方法（固定参数）
     * 
     * @param int $uid 用户ID
     * @param int $extendId 试卷编号
     * @return void
     */
    protected function test($uid, $extendId)
    {
        try {
            // 处理消息
            $this->processMessage($uid, $extendId);
            file_put_contents('runtime/test_success.log', date('Y-m-d H:i:s') . " - 测试成功: uid={$uid}, extendId={$extendId}\n", FILE_APPEND);
        } catch (\Exception $e) {
            file_put_contents('runtime/test_error.log', date('Y-m-d H:i:s') . " - 测试失败: {$e->getMessage()}\n", FILE_APPEND);
        }
    }

    /**
     * 处理单条消息
     * 
     * @param int $uid 用户ID
     * @param int $extendId 试卷编号
     * @return void
     */
    protected function processMessage($uid, $extendId)
    {
        // 通过试卷编号(extend_id)获取课程ID
        $coursePaperModel = new CoursePaper();
        $courseId = $coursePaperModel->where('id', $extendId)->value('course_id', 0);

        if (!$courseId) {
            throw new BusinessException('试卷对应的课程不存在');
        }

        // 更新课程学习统计
        $this->updateCourseLearnStats($uid, $courseId);

        // 更新试卷学习统计
        $this->updatePaperLearnStats($uid, $extendId);

        // 更新试卷分类学习统计
        $this->updatePaperCateLearnStats($uid, $extendId);
    }

    /**
     * 更新课程学习统计
     * 
     * @param int $uid 用户ID
     * @param int $courseId 课程ID
     * @return void
     */
    protected function updateCourseLearnStats($uid, $courseId)
    {
        // 获取答题统计数据
        $answerModel = new AnswerQuestion();
        $statsData = $answerModel->getUserAnswerStatsByUidAndCourseId($uid, $courseId);

        //var_dump($statsData);

        // 准备更新数据
        $data = [
            'today_question_count' => $statsData['today_question_count'],
            'total_question_count' => $statsData['total_question_count'],
            'correct_rate' => $statsData['correct_rate'],
            'update_time' => time()
        ];

        // 更新或创建统计记录
        $statsModel = new CourseLearnStats();
        $statsModel->updateUserStats($uid, $courseId, $data);
    }

    /**
     * 更新试卷学习统计
     * 
     * @param int $uid 用户ID
     * @param int $extendId 试卷编号
     * @return void
     */
    protected function updatePaperLearnStats($uid, $extendId)
    {
        // 检查试卷是否存在
        $paperModel = new CoursePaper();
        $paperInfo = $paperModel->where('id', $extendId)->find();
        if (!$paperInfo) {
            throw new BusinessException('试卷不存在');
        }

        // 获取试卷答题统计数据
        $answerModel = new AnswerQuestion();
        $statsData = $answerModel->getPaperAnswerStats([$extendId], $uid);


        // 准备更新数据
        $updateData = [
            'total_question_count' => $statsData['total_question_count'],
            'total_correct_count' => $statsData['total_correct_count'],
            'correct_rate' => $statsData['correct_rate'],
            'update_time' => time()
        ];

        // 更新或创建统计记录
        $statsModel = new CoursePaperLearnStats();
        $statsModel->updateUserPaperStats($uid, $extendId, $updateData);
    }

    /**
     * 更新试卷分类学习统计
     * 
     * @param int $uid 用户ID
     * @param int $extendId 试卷编号
     * @return void
     */
    protected function updatePaperCateLearnStats($uid, $extendId)
    {
        // 检查试卷是否存在
        $paperModel = new CoursePaper();
        $paperInfo = $paperModel->where('id', $extendId)->find();
        if (!$paperInfo) {
            throw new BusinessException('试卷不存在');
        }

        // 获取试卷分类ID
        $paperCateId = $paperInfo['category_id'];


        // 更新或创建统计记录
        $statsModel = new CoursePaperCateLearnStats();
        $statsModel->setUserCateStatsByCategoryId($uid, $paperCateId);
    }
}
